# coding:utf-8
import json
import os
import subprocess

import pandas as pd
from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QFileDialog, QTableWidgetItem, QCheckBox
from qfluentwidgets import PushButton, SubtitleLabel, TableWidget, Dialog

from app.util.PPTXUtils import create_main_image, ppt_to_images


class DataInterface(QWidget):
    """ 选择 Excel 文件并展示内容 """

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setObjectName('dataInterface')
        # 存储 需要生成图片相关信息
        self.excel_files_info = []
        # 创建布局
        self.layout = QVBoxLayout(self)
        self.layout.setContentsMargins(20, 20, 20, 20)
        self.layout.setSpacing(10)

        # 标题
        self.title = SubtitleLabel("请选择 Excel 文件", self)

        # 显示文件名的标签
        self.fileLabel = QLabel("未选择文件", self)

        # 选择文件按钮
        self.selectButton = PushButton("选择文件", self)
        self.selectButton.clicked.connect(self.selectFile)

        # 生成图片按钮
        self.startGenerateButton = PushButton("开始生成", self)
        self.startGenerateButton.clicked.connect(self.startGenerate)

        # 表格展示
        self.tableWidget = TableWidget(self)
        self.tableWidget.setColumnCount(0)  # 初始化时没有列
        self.tableWidget.setHorizontalHeaderLabels([])

        # 添加组件到布局
        self.layout.addWidget(self.title)
        self.layout.addWidget(self.fileLabel)
        self.layout.addWidget(self.selectButton)
        self.layout.addWidget(self.startGenerateButton)
        self.layout.addWidget(self.tableWidget)

    def selectFile(self):
        """ 选择 Excel 文件 """
        default_path = r"F:\.desktop\wb\xhs_image\data\模板"  # 设定默认打开的路径
        file_path, _ = QFileDialog.getOpenFileName(self, "选择 Excel 文件", default_path, "Excel 文件 (*.xlsx *.xls)")
        if file_path:  # 如果选择了文件
            self.fileLabel.setText(f"已选择: {file_path.split('/')[-1]}")
            df = pd.read_excel(file_path)
            # 校验数据
            is_right_data, msg = self.validate_data(df)
            if is_right_data:
                self.populate_table(df)
            else:
                w = Dialog("数据校验失败", f"数据没有通过校验,请修改后重新导入\n具体原因如下:\n{msg}", self)
                if w.exec():
                    print('确认')
                else:
                    print('取消')

    def startGenerate(self):
        print("开始生成图片")
        with open("config.json", 'r', encoding='utf-8') as file:
            config = json.load(file)
        output_path = config['output_path']
        # 遍历每一行数据
        for row in self.excel_files_info:
            # 生成主图
            ppt_path = create_main_image(row, output_path)
            ppt_to_images(ppt_path, output_path)
        w = Dialog("生成成功", f"生成图片成功,是否查看输出文件?\n{output_path}", self)
        if w.exec():
            print('确认')
            # 打开生成模板的位置
            path = output_path
            subprocess.run(f'explorer {path}', shell=True)
        else:
            print('取消')
        pass

    def read_excel(self, file_path):
        """ 读取 Excel 文件并展示数据 """
        try:
            df = pd.read_excel(file_path)
            if self.validate_data(df):  # 校验数据
                self.populate_table(df)

        except Exception as e:
            print(f"读取 Excel 文件出错: {e}")

    def validate_data(self, df):
        """ 校验表格数据 """

        required_columns = ["模板路径", "原文本", "替换文本", "配图文件夹"]

        # 确保所有列都存在
        if not all(col in df.columns for col in required_columns):
            print("数据缺少必要的列")
            return False, "数据缺少必要的列"

        for index, row in df.iterrows():
            # 1. 确保四个字段不为空
            if any(pd.isna(row[col]) or row[col] == "" for col in required_columns):
                print(f"第 {index + 1} 行有空值")
                return False, f"第 {index + 1} 行有空值"

            # 2. 校验路径是否存在
            if not os.path.exists(row["模板路径"]):
                print(f"第 {index + 1} 行的模板路径不存在: {row['模板路径']}")
                return False, f"第 {index + 1} 行的模板路径不存在: {row['模板路径']}"

            if not os.path.exists(row["配图文件夹"]):
                print(f"第 {index + 1} 行的配图文件夹路径不存在: {row['配图文件夹']}")
                return False, f"第 {index + 1} 行的配图文件夹路径不存在: {row['配图文件夹']}"

            # 3. 校验原文本和替换文本数量一致
            original_texts = row["原文本"].split(",")
            replaced_texts = row["替换文本"].split(",")

            if len(original_texts) != len(replaced_texts):
                print(f"第 {index + 1} 行原文本和替换文本数量不一致: {row['原文本']} vs {row['替换文本']}")
                return False, f"第 {index + 1} 行原文本和替换文本数量不一致: {row['原文本']} vs {row['替换文本']}"

        print("数据校验通过")
        return True, "数据校验通过"

    # 填充数据进入表格并保存到self中
    def populate_table(self, df):
        """ 填充表格数据 """

        # 清空之前的表格内容
        self.tableWidget.setRowCount(0)
        self.tableWidget.setColumnCount(len(df.columns))

        # 设置表头
        self.tableWidget.setHorizontalHeaderLabels(df.columns.tolist())

        # 设置固定列宽
        self.tableWidget.setColumnWidth(0, 200)  # 模板路径列宽
        self.tableWidget.setColumnWidth(1, 150)  # 原文本列宽
        self.tableWidget.setColumnWidth(2, 150)  # 替换文本列宽
        self.tableWidget.setColumnWidth(3, 200)  # 配图文件夹路径列宽

        for row_index, row in df.iterrows():
            row_position = self.tableWidget.rowCount()
            self.tableWidget.insertRow(row_position)

            excel_row = {
                'template_path': '',
                'old_text': '',
                'new_text': '',
                'image_path': ''
            }

            # 假设 row 包含四个值，且顺序与 excel_row 的键一致
            keys = list(excel_row.keys())

            for column_index, value in enumerate(row):
                # 设置每个单元格的内容
                self.tableWidget.setItem(row_position, column_index, QTableWidgetItem(str(value)))

                # 更新 excel_row 中对应的键
                if column_index < len(keys):
                    excel_row[keys[column_index]] = value

            # 这里可以使用更新后的 excel_row 进行其他操作
            self.excel_files_info.append(excel_row)
